Amazon S3 バージョン数の世代管理ライフサイクル設定をした CloudFormation サンプルテンプレートの紹介

Amazon S3 バージョン数の世代管理ライフサイクル設定をした CloudFormation サンプルテンプレートの紹介

Clock Icon2022.02.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

以下のブログで紹介されているライフサイクルで世代管理を実現する「バージョン数の保持」のライフサイクル設定をしたCloudFormationのテンプレートを作成する機会がありました。

ドキュメントを確認したところ似た名前のプロパティが紛らわしかったので合わせて紹介します。

ドキュメント確認

ドキュメントを確認するとNoncurrentVersionExpirationNoncurrentVersionExpirationInDays(末尾にInDaysがあるかないかの違い)の似た名前のプロパティがあります。

AWS::S3::Bucket Rule - AWS CloudFormation

名前が紛らわしいので各プロパティでできることを整理します。

  • NoncurrentVersionExpiration: 指定した世代数分は指定した日数経過後、特定のアクション(削除、移行)の対象外にでき、対象外の世代に対して特定のアクションを実行する
    • 冒頭のブログで紹介されている世代管理の内容はこちらのプロパティです。
  • NoncurrentVersionExpirationInDays: 指定した日数経過後、特定のアクション(削除、移行)を実行する
    • こちらのプロパティは非推奨となっています。
    • 世代数保持指定が可能になったInDaysなしのプロパティがオススメです。

違いがわかったところでNoncurrentVersionExpirationのプロパティを使ったテンプレートを作ってみます。

S3バケット作成テンプレート

世代管理のバージョン数保持設定が目的なのですが、サンプルテンプレートとして以下のよく使いそうな設定も加えました。

  • S3バケットの暗号化(SSE-S3)
  • ACL無効
  • バージョニング有効
  • パブリックアクセス無効
  • バケット全体に対してのライフサイクルルール設定
    • 未完了なマルチパートアップロード削除
    • 世代管理のバージョン数保持
    • Intelligent-Tiering ストレージクラスへ移動
AWSTemplateFormatVersion: "2010-09-09"
Description: Create S3 Bucket

Parameters:
  ProjectName:
    Description: Project Name
    Type: String
    Default: unnamed
  Environment:
    Description: Environment
    Type: String
    Default: dev
    AllowedValues:
      - prod
      - dev
  S3BucketName:
    Description: Backet Name
    Type: String

Resources:
  # ------------------------------------------------------------------------------------ #
  # S3
  # ------------------------------------------------------------------------------------ #
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub ${ProjectName}-${Environment}-${S3BucketName}-${AWS::AccountId}
      OwnershipControls: # ACL無効化設定
        Rules:
          - ObjectOwnership: "BucketOwnerEnforced"
      PublicAccessBlockConfiguration: # パブリックアクセスの設定
        BlockPublicAcls: True
        BlockPublicPolicy: True
        IgnorePublicAcls: True
        RestrictPublicBuckets: True
      VersioningConfiguration: # バージョニング設定
        Status: Enabled
      BucketEncryption: # 暗号化設定
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: "AES256"
            BucketKeyEnabled: false
      LifecycleConfiguration: # ライフサイクルルール設定
        Rules:
          - Id: AbortIncompleteMultipartUpload # 未完了なマルチパートアップロードの削除
            AbortIncompleteMultipartUpload:
              DaysAfterInitiation: 7
            Status: "Enabled"
          - Id: NoncurrentVersionExpiration # 世代管理のバージョン数保持
            NoncurrentVersionExpiration:
              NewerNoncurrentVersions: 3
              NoncurrentDays: 1
            Status: Enabled
          - Id: IntelligentTiering # Intelligent-Tieringへ移動
            Transitions:
              - TransitionInDays: 14
                StorageClass: INTELLIGENT_TIERING
            Status: Enabled

その他設定補足

ACL無効化

ACL無効できるようになってからCloudFormationでS3バケット作る機会がなかったのでついでに調べて追加しました。

CloudFrontのアクセスログ保存用S3バケットを作成する予定であれば以下のブログもご確認ください。

未完了なマルチパートアップロードのクリーンアップ

長期で残しておく必要性は感じられないので一定期間経過で削除します。

Intelligent-Tiering

オブジェクト数が大量にあったり、一時的にしか保存しないオブジェクトの場合は逆に高くつく可能性もあります。設定するかしないかはS3バケットの利用用途に応じて判断必要になります。

上のブログの後に新しい階層が追加されています。以下のブログもご参考にしてください。

できあがったS3バケットの設定

テンプレートから作成したS3バケットをマネジメントコンソールから確認します。

ACL 無効化

ACL が無効になっていることを確認できました。文字が小さいですね。

編集ボタンをクリックしてもう少しわかりやすい画面も載せておきます。

ライフサイクル設定3種類

ライフサイクルルールは3個追加されています。

今回のテーマだった世代管理を実現した「バージョン数の保持」設定が入っています。設置値の動作検証は冒頭のブログで紹介されております。

未完了なマルチパートアップロードのクリーンアップも設定されています。

Intelligent-Tiering の設定も意図通り入っています。

以上、世代管理を実現した「バージョン数の保持」のCloudFormationテンプレートを作成してみたでした。

おわりに

過去に自分で作成したライフサイクル設定を確認してみるとNoncurrentVersionExpirationInDaysで設定していました。当時はそれでよかったのですが、以前使用していたプロパティが非推奨になっていたので新規でS3バケットを作成するときは以前のテンプレートを使い回さないように気をつけたいです。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.